<!DOCTYPE html>




<html class="theme-next gemini" lang="zh-Hans">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<meta name="theme-color" content="#222">









<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
















  
  
  <link href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />







<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=5.1.3" rel="stylesheet" type="text/css" />


  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=5.1.3">


  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png?v=5.1.3">


  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png?v=5.1.3">


  <link rel="mask-icon" href="/images/logo.svg?v=5.1.3" color="#222">





  <meta name="keywords" content="Android,Http,OkHttp,Curl,PostMan," />





  <link rel="alternate" href="/atom.xml" title="流水不腐小夏" type="application/atom+xml" />






<meta name="description" content="Android Http网络开发神兵利器   Android Http网络开发神兵利器 Http协议 HTTP简介 主要特点 Request Response Code Method Header   网络请求库 URLConnection Apache HttpClient Volley OkHttp &amp;amp; Retrofit   工具 Charles PostMan &amp;amp; Paw C">
<meta name="keywords" content="Android,Http,OkHttp,Curl,PostMan">
<meta property="og:type" content="article">
<meta property="og:title" content="Android Http网络开发神兵利器">
<meta property="og:url" content="http://mycommons.cn/2016/12/25/Android-Net/index.html">
<meta property="og:site_name" content="流水不腐小夏">
<meta property="og:description" content="Android Http网络开发神兵利器   Android Http网络开发神兵利器 Http协议 HTTP简介 主要特点 Request Response Code Method Header   网络请求库 URLConnection Apache HttpClient Volley OkHttp &amp;amp; Retrofit   工具 Charles PostMan &amp;amp; Paw C">
<meta property="og:locale" content="zh-Hans">
<meta property="og:image" content="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/http_request_response.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/http_request.png">
<meta property="og:image" content="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/http_reponse.jpg">
<meta property="og:image" content="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/post_man.png">
<meta property="og:image" content="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/paw.png">
<meta property="og:image" content="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/chrome_dev_tools.png">
<meta property="og:image" content="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/curl.png">
<meta property="og:image" content="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/chuck.gif">
<meta property="og:image" content="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/multiwindow.gif">
<meta property="og:updated_time" content="2017-10-25T11:46:51.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Android Http网络开发神兵利器">
<meta name="twitter:description" content="Android Http网络开发神兵利器   Android Http网络开发神兵利器 Http协议 HTTP简介 主要特点 Request Response Code Method Header   网络请求库 URLConnection Apache HttpClient Volley OkHttp &amp;amp; Retrofit   工具 Charles PostMan &amp;amp; Paw C">
<meta name="twitter:image" content="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/http_request_response.jpg">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Gemini',
    version: '5.1.3',
    sidebar: {"position":"left","display":"always","offset":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: true,
    tabs: true,
    motion: {"enable":false,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    duoshuo: {
      userId: '0',
      author: '博主'
    },
    algolia: {
      applicationID: 'GRLHBBCD9E',
      apiKey: '759ab3f5c09b132b3ed4842a44c53c45',
      indexName: 'mycommons',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="http://mycommons.cn/2016/12/25/Android-Net/"/>





  <title>Android Http网络开发神兵利器 | 流水不腐小夏</title>
  





  <script type="text/javascript">
    var _hmt = _hmt || [];
    (function() {
      var hm = document.createElement("script");
      hm.src = "https://hm.baidu.com/hm.js?55458ffca1f60dd283f11b9a7f82b262";
      var s = document.getElementsByTagName("script")[0];
      s.parentNode.insertBefore(hm, s);
    })();
  </script>




</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">

  
  
    
  

  <div class="container sidebar-position-left page-post-detail">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/"  class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">流水不腐小夏</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <h1 class="site-subtitle" itemprop="description">http://mycommons.cn</h1>
      
  </div>

  <div class="site-nav-toggle">
    <button>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-tags">
          <a href="/tags/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />
            
            标签
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/categories/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-th"></i> <br />
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/archives/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            归档
          </a>
        </li>
      
        
        <li class="menu-item menu-item-commonweal">
          <a href="/404.html" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-heartbeat"></i> <br />
            
            公益404
          </a>
        </li>
      

      
        <li class="menu-item menu-item-search">
          
            <a href="javascript:;" class="popup-trigger">
          
            
              <i class="menu-item-icon fa fa-search fa-fw"></i> <br />
            
            搜索
          </a>
        </li>
      
    </ul>
  

  
    <div class="site-search">
      
  
  <div class="algolia-popup popup search-popup">
    <div class="algolia-search">
      <div class="algolia-search-input-icon">
        <i class="fa fa-search"></i>
      </div>
      <div class="algolia-search-input" id="algolia-search-input"></div>
    </div>

    <div class="algolia-results">
      <div id="algolia-stats"></div>
      <div id="algolia-hits"></div>
      <div id="algolia-pagination" class="algolia-pagination"></div>
    </div>

    <span class="popup-btn-close">
      <i class="fa fa-times-circle"></i>
    </span>
  </div>




    </div>
  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://mycommons.cn/2016/12/25/Android-Net/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="流水不腐小夏">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpeg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="流水不腐小夏">
    </span>

    
      <header class="post-header">

        
        
          <h2 class="post-title" itemprop="name headline">Android Http网络开发神兵利器</h2>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2016-12-25T18:58:57+08:00">
                2016-12-25
              </time>
            

            

            
          </span>

          

          
            
              <span class="post-comments-count">
                <span class="post-meta-divider">|</span>
                <span class="post-meta-item-icon">
                  <i class="fa fa-comment-o"></i>
                </span>
                <a href="/2016/12/25/Android-Net/#comments" itemprop="discussionUrl">
                  <span class="post-comments-count disqus-comment-count"
                        data-disqus-identifier="2016/12/25/Android-Net/" itemprop="commentCount"></span>
                </a>
              </span>
            
          

          
          

          
            <span class="post-meta-divider">|</span>
            <span class="page-pv">本文总阅读量
            <span class="busuanzi-value" id="busuanzi_value_page_pv" ></span>次
            </span>
          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        <h1 id="Android-Http网络开发神兵利器"><a href="#Android-Http网络开发神兵利器" class="headerlink" title="Android Http网络开发神兵利器"></a>Android Http网络开发神兵利器</h1><hr>
<!-- TOC -->
<ul>
<li><a href="#android-http网络开发神兵利器">Android Http网络开发神兵利器</a></li>
<li><a href="#http协议">Http协议</a><ul>
<li><a href="#http简介">HTTP简介</a></li>
<li><a href="#主要特点">主要特点</a></li>
<li><a href="#request">Request</a></li>
<li><a href="#response">Response</a></li>
<li><a href="#code">Code</a></li>
<li><a href="#method">Method</a></li>
<li><a href="#header">Header</a></li>
</ul>
</li>
<li><a href="#网络请求库">网络请求库</a><ul>
<li><a href="#urlconnection">URLConnection</a></li>
<li><a href="#apache-httpclient">Apache HttpClient</a></li>
<li><a href="#volley">Volley</a></li>
<li><a href="#okhttp--retrofit">OkHttp &amp; Retrofit</a></li>
</ul>
</li>
<li><a href="#工具">工具</a><ul>
<li><a href="#charles">Charles</a></li>
<li><a href="#postman--paw">PostMan &amp; Paw</a></li>
<li><a href="#chrome-dev-tools">Chrome Dev Tools</a></li>
<li><a href="#curl">curl</a></li>
</ul>
</li>
<li><a href="#okhttp相关">OkHttp相关</a><ul>
<li><a href="#logging-interceptor">logging-interceptor</a></li>
<li><a href="#stetho">Stetho</a></li>
<li><a href="#chuck">chuck</a></li>
</ul>
</li>
<li><a href="#其他">其他</a><ul>
<li><a href="#restful">RESTful</a></li>
</ul>
</li>
<li><a href="#总结">总结</a><ul>
<li><a href="#心得">心得</a></li>
<li><a href="#工具对比">工具对比</a><ul>
<li><a href="#charles--fiddler">Charles &amp; Fiddler</a></li>
<li><a href="#okhttp相关-1">OkHttp相关</a></li>
</ul>
</li>
<li><a href="#其他建议">其他建议</a></li>
</ul>
</li>
<li><a href="#参考资料">参考资料</a></li>
</ul>
<!-- /TOC -->
<p>本人在Android移动端开发已经有不少年的经验，经历颇多，感受颇深，特写下此文记录下在Android Http网络开发中的各种工具使用，如果有其他想法和建议，欢迎前来交流 xiaqiulei@126.com 。 本人文笔较差，请不要见怪。</p>
<p>Android开发的时候，很多APP都是基于网络请求的，大部分应用都是基于http的，少部分是基于Socket的，本文主要介绍Android Http开发的主要实践和工具。</p>
<p>本文最先发表于<a href="https://github.com/LiushuiXiaoxia/AndroidHttp" target="_blank" rel="external">Github</a>，如有转载，请注明转载出处。</p>
<h1 id="Http协议"><a href="#Http协议" class="headerlink" title="Http协议"></a>Http协议</h1><p>说起Http网络请求，那么要介绍下Http协议，我在公司面试的时候也很喜欢问这个问题。很多做好了3-5年的工程师，竟然不知道Http协议，只知道怎么调用类库，不知道原理。</p>
<p>作为一个有追求的程序员，Http协议还是需要了解的。知其然知其所以然，在了解Http协议的情况下，才能在实际开发中灵活运用和优化。</p>
<p>这里有篇 <a href="http://www.cnblogs.com/ranyonsue/p/5984001.html" target="_blank" rel="external">文章</a> ，Http协议介绍的很详细。</p>
<h2 id="HTTP简介"><a href="#HTTP简介" class="headerlink" title="HTTP简介"></a>HTTP简介</h2><p>HTTP协议是Hyper Text Transfer Protocol（超文本传输协议）的缩写,是用于从万维网（WWW:World Wide Web ）服务器传输超文本到本地浏览器的传送协议。</p>
<p>HTTP是一个基于TCP/IP通信协议来传递数据（HTML 文件, 图片文件, 查询结果等）。</p>
<p>HTTP是一个属于应用层的面向对象的协议，由于其简捷、快速的方式，适用于分布式超媒体信息系统。它于1990年提出，经过几年的使用与发展，得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版，HTTP/1.1的规范化工作正在进行之中，而且HTTP-NG(Next Generation of HTTP)的建议已经提出。</p>
<p>HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后，向客户端发送响应信息。</p>
<p><img src="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/http_request_response.jpg" alt=""></p>
<h2 id="主要特点"><a href="#主要特点" class="headerlink" title="主要特点"></a>主要特点</h2><p>1、简单快速：客户向服务器请求服务时，只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单，使得HTTP服务器的程序规模小，因而通信速度很快。</p>
<p>2、灵活：HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。</p>
<p>3.无连接：无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求，并收到客户的应答后，即断开连接。采用这种方式可以节省传输时间。</p>
<p>4.无状态：HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息，则它必须重传，这样可能导致每次连接传送的数据量增大。另一方面，在服务器不需要先前信息时它的应答就较快。</p>
<p>5、支持B/S及C/S模式。</p>
<h2 id="Request"><a href="#Request" class="headerlink" title="Request"></a>Request</h2><p><img src="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/http_request.png" alt="Http请求消息结构"></p>
<p>上图是一个Http请求消息结构，我们可以使用抓包工具抓取网络请求,因为是Get请求，所以后面没有请求数据</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">GET /562f25980001b1b106000338.jpg HTTP/1.1</div><div class="line">Host    img.mukewang.com</div><div class="line">User-Agent    Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36</div><div class="line">Accept    image/webp,image/*,*/*;q=0.8</div><div class="line">Referer    http://www.imooc.com/</div><div class="line">Accept-Encoding    gzip, deflate, sdch</div><div class="line">Accept-Language    zh-CN,zh;q=0.8</div></pre></td></tr></table></figure>
<p>第一部分：请求行，用来说明请求类型,要访问的资源以及所使用的HTTP版本.</p>
<p>GET说明请求类型为GET,[/562f25980001b1b106000338.jpg]为要访问的资源，该行的最后一部分说明使用的是HTTP1.1版本。</p>
<p>第二部分：请求头部，紧接着请求行（即第一行）之后的部分，用来说明服务器要使用的附加信息</p>
<p>从第二行起为请求头部，HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等</p>
<p>第三部分：空行，请求头部后面的空行是必须的</p>
<p>即使第四部分的请求数据为空，也必须有空行。</p>
<p>第四部分：请求数据也叫主体，可以添加任意的其他数据。</p>
<p>这个例子的请求数据为空。</p>
<p>下面这个例子是Post方式。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">POST / HTTP1.1</div><div class="line">Host:www.wrox.com</div><div class="line">User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)</div><div class="line">Content-Type:application/x-www-form-urlencoded</div><div class="line">Content-Length:40</div><div class="line">Connection: Keep-Alive</div><div class="line"></div><div class="line">name=Professional%20Ajax&amp;publisher=Wiley</div></pre></td></tr></table></figure>
<p>第一部分：请求行，第一行明了是post请求，以及http1.1版本。</p>
<p>第二部分：请求头部，第二行至第六行。</p>
<p>第三部分：空行，第七行的空行。</p>
<p>第四部分：请求数据，第八行。</p>
<h2 id="Response"><a href="#Response" class="headerlink" title="Response"></a>Response</h2><p>一般情况下，服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。</p>
<p>HTTP响应也由四个部分组成，分别是：状态行、消息报头、空行和响应正文。</p>
<p><img src="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/http_reponse.jpg" alt="Http响应消息结构"></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">HTTP/1.1 200 OK</div><div class="line">Date: Fri, 22 May 2009 06:07:21 GMT</div><div class="line">Content-Type: text/html; charset=UTF-8</div><div class="line"></div><div class="line">&lt;html&gt;</div><div class="line">      &lt;head&gt;&lt;/head&gt;</div><div class="line">      &lt;body&gt;</div><div class="line">            &lt;!--body goes here--&gt;</div><div class="line">      &lt;/body&gt;</div><div class="line">&lt;/html&gt;</div></pre></td></tr></table></figure>
<p>第一部分：状态行，由HTTP协议版本号， 状态码， 状态消息 三部分组成。</p>
<p>第一行为状态行，（HTTP/1.1）表明HTTP版本为1.1版本，状态码为200，状态消息为（ok）</p>
<p>第二部分：消息报头，用来说明客户端要使用的一些附加信息</p>
<p>第二行和第三行为消息报头，<br>Date:生成响应的日期和时间；Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8</p>
<p>第三部分：空行，消息报头后面的空行是必须的</p>
<p>第四部分：响应正文，服务器返回给客户端的文本信息。</p>
<p>空行后面的html部分为响应正文。</p>
<h2 id="Code"><a href="#Code" class="headerlink" title="Code"></a>Code</h2><p>状态代码有三位数字组成，第一个数字定义了响应的类别，共分五种类别:</p>
<p>1xx：指示信息–表示请求已接收，继续处理</p>
<p>2xx：成功–表示请求已被成功接收、理解、接受</p>
<p>3xx：重定向–要完成请求必须进行更进一步的操作</p>
<p>4xx：客户端错误–请求有语法错误或请求无法实现</p>
<p>5xx：服务器端错误–服务器未能实现合法的请求</p>
<p>常见状态码：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">200 OK                        // 客户端请求成功</div><div class="line">400 Bad Request               // 客户端请求有语法错误，不能被服务器所理解</div><div class="line">401 Unauthorized              // 请求未经授权，这个状态代码必须和WWW-Authenticate报头域一起使用</div><div class="line">403 Forbidden                 // 服务器收到请求，但是拒绝提供服务</div><div class="line">404 Not Found                 // 请求资源不存在，eg：输入了错误的URL</div><div class="line">500 Internal Server Error     // 服务器发生不可预期的错误</div><div class="line">503 Server Unavailable        // 服务器当前不能处理客户端的请求，一段时间后可能恢复正常</div></pre></td></tr></table></figure>
<h2 id="Method"><a href="#Method" class="headerlink" title="Method"></a>Method</h2><p>根据HTTP标准，HTTP请求可以使用多种请求方法。<br>HTTP1.0定义了三种请求方法： GET, POST 和 HEAD方法。<br>HTTP1.1新增了五种请求方法：OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">GET     请求指定的页面信息，并返回实体主体。</div><div class="line">HEAD     类似于get请求，只不过返回的响应中没有具体的内容，用于获取报头</div><div class="line">POST     向指定资源提交数据进行处理请求（例如提交表单或者上传文件）。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。</div><div class="line">PUT     从客户端向服务器传送的数据取代指定的文档的内容。</div><div class="line">DELETE      请求服务器删除指定的页面。</div><div class="line">CONNECT     HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。</div><div class="line">OPTIONS     允许客户端查看服务器的性能。</div><div class="line">TRACE     回显服务器收到的请求，主要用于测试或诊断。</div></pre></td></tr></table></figure>
<h2 id="Header"><a href="#Header" class="headerlink" title="Header"></a>Header</h2><p>HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行（对于请求消息，开始行就是请求行，对于响应消息，开始行就是状态行），消息报头（可选），空行（只有CRLF的行），消息正文（可选）组成。</p>
<p>HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。<br>每一个报头域都是由名字+“：”+空格+值 组成，消息报头域的名字是大小写无关的。</p>
<h1 id="网络请求库"><a href="#网络请求库" class="headerlink" title="网络请求库"></a>网络请求库</h1><p>下面介绍几个常见的Android http网路开发的工具库。</p>
<h2 id="URLConnection"><a href="#URLConnection" class="headerlink" title="URLConnection"></a>URLConnection</h2><p>URLConnection是Java JDK中自带的网络请求类，使用的场景不多，因为使用比较繁琐，直接使用底层IO流进行开发，需要了解Http协议才能很好的使用，很多时候需要自己封装，不方便。一般的一些提供第三方服务的sdk会使用，一是为了保证sdk体积大小，二是减少不必要的第三方库引入。</p>
<p>这里不做详细介绍， <a href="http://www.blogjava.net/supercrsky/articles/247449.html" target="_blank" rel="external">这里有一篇博可以详细介绍了</a> 。</p>
<h2 id="Apache-HttpClient"><a href="#Apache-HttpClient" class="headerlink" title="Apache HttpClient"></a>Apache HttpClient</h2><p>HttpClient是Apache Jakarta Common下的子项目，用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包，并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中，比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。</p>
<p>HttpClient相比传统JDK自带的URLConnection，增加了易用性和灵活性，它不仅是客户端发送Http请求变得容易，而且也方便了开发人员测试接口（基于Http协议的），即提高了开发的效率，也方便提高代码的健壮性。</p>
<p>Android在低版本的系统Api中也有Httpclient相关类，但是后来就已经废弃,相关资料可以 <a href="https://developer.android.com/reference/org/apache/http/client/package-summary.html" target="_blank" rel="external">参考这里</a>.</p>
<p><a href="http://blog.csdn.net/wangpeng047/article/details/19624529" target="_blank" rel="external">HttpClient相关博客</a></p>
<h2 id="Volley"><a href="#Volley" class="headerlink" title="Volley"></a>Volley</h2><p><a href="https://developer.android.com/training/volley/index.html" target="_blank" rel="external">Android Volley</a> 是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身，既可以像AsyncHttpClient一样非常简单地进行HTTP通信，也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外，Volley在性能方面也进行了大幅度的调整，它的设计目标就是非常适合去进行数据量不大，但通信频繁的网络操作，而对于大数据量的网络操作，比如说下载文件等，Volley的表现就会非常糟糕。</p>
<p>有 <a href="http://blog.csdn.net/guolin_blog/article/details/12452307" target="_blank" rel="external">资料</a> 指出Volley在进行网络请求时，在Android 2.3及以上版本，使用的是HttpURLConnection，而在Android 2.2及以下版本，使用的是HttpClient。主要是因为HttpURLConnection存在相关bug。</p>
<p><a href="http://blog.csdn.net/guolin_blog/article/details/17482095" target="_blank" rel="external">Volley相关资料</a></p>
<p><a href="http://blog.csdn.net/guolin_blog/article/details/12452307" target="_blank" rel="external">Volley相关资料</a></p>
<h2 id="OkHttp-amp-Retrofit"><a href="#OkHttp-amp-Retrofit" class="headerlink" title="OkHttp &amp; Retrofit"></a>OkHttp &amp; Retrofit</h2><p>OkHttpSquare公司开源的处理网络请求的开源项目,是安卓端最火热的轻量级框架，用于替代HttpUrlConnection和Apache HttpClient。最新的版本是OkHttp3，Github地址在 <a href="https://github.com/square/okhttp" target="_blank" rel="external">这里</a> 。</p>
<p>Retrofit也是是Square公司开发的一款针对Android网络请求的框架，Retrofit2底层基于OkHttp实现的，OkHttp现在已经得到Google官方认可，大量的app都采用OkHttp做网络请求， <a href="https://github.com/square/retrofit" target="_blank" rel="external">Github地址</a> 。</p>
<p>网络上也有很多关于OkHttp、Retrofit的示例和资料，而且是目前Android移动端最流行的框架，还是很值得了解一下，在这里就不做详细介绍。</p>
<h1 id="工具"><a href="#工具" class="headerlink" title="工具"></a>工具</h1><h2 id="Charles"><a href="#Charles" class="headerlink" title="Charles"></a>Charles</h2><p>Charles是一个HTTP代理服务器,HTTP监视器,反转代理服务器·它允许一个开发者查看所有连接互联网的HTTP通信·这些包括request、response、headers（包含cookies与caching信息），由于笔者的开发机器是Mac，所以只介绍了Charles，Windows开发环境的同学可以使用fiddler。</p>
<p><a href="http://blog.devtang.com/2015/11/14/charles-introduction/" target="_blank" rel="external">Charles介绍</a></p>
<p>Charles 主要的功能包括：</p>
<blockquote>
<p>截取 Http 和 Https 网络封包。</p>
<p>支持网络请求调试，设置断点，方便调试</p>
<p>支持重发网络请求，方便后端调试。</p>
<p>支持修改网络请求参数。</p>
<p>支持网络请求的截获并动态修改。</p>
<p>支持模拟弱网。</p>
</blockquote>
<p>上面介绍了，可以使用Charles方便设置断点，方便调试，可以很容易的修改数据包，这样可以动态修改数据，mock api接口，在实际开发过程中很有用。</p>
<p><a href="http://blog.csdn.net/guijiaoba/article/details/43198503" target="_blank" rel="external">Charles Mock 数据</a></p>
<h2 id="PostMan-amp-Paw"><a href="#PostMan-amp-Paw" class="headerlink" title="PostMan &amp; Paw"></a>PostMan &amp; Paw</h2><p>上面介绍了网络抓包工具Charles，先介绍2款模拟http请求的软件。</p>
<p>Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件,使用很简单。</p>
<p>下图模拟发送知乎Api的网络请求。</p>
<p><code>http://news-at.zhihu.com/api/4/themes</code></p>
<p><img src="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/post_man.png" alt=""></p>
<p><a href="https://www.getpostman.com/" target="_blank" rel="external">Postman官网</a></p>
<p><a href="http://chromecj.com/web-development/2014-09/60.html" target="_blank" rel="external">Postman资料</a></p>
<p>Paw 也是类似于Postman的一款模拟http请求的软件，只不过postman依赖于chrome，经常需要点击2此才可以打开postman，所以个人更加喜欢paw，下图是paw请求知乎api的示例。BTW, paw是一款收费的软件，不过么网上也有破解的，在这里就不介绍如何获取了，反正大家都懂的。</p>
<p><img src="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/paw.png" alt=""></p>
<p><a href="https://paw.cloud/" target="_blank" rel="external">Paw 官网</a></p>
<p><a href="https://yq.aliyun.com/articles/29772" target="_blank" rel="external">Paw 使用教程</a></p>
<h2 id="Chrome-Dev-Tools"><a href="#Chrome-Dev-Tools" class="headerlink" title="Chrome Dev Tools"></a>Chrome Dev Tools</h2><p>Chrome dev tools是Google Chrome浏览器中自带一块调试工具。如果你是做软件开发的，基本都了解过。</p>
<p>虽然Chrome dev tools 在web开发中使用很多，但是在移动端中也是有用到的，这个后面再介绍。</p>
<p><img src="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/chrome_dev_tools.png" alt=""></p>
<p><a href="https://developer.chrome.com/devtools" target="_blank" rel="external">Chrome dev tools 相关资料</a></p>
<p><a href="https://github.com/GoogleChrome/devtools-docs" target="_blank" rel="external">Chrome dev tools 相关资料</a></p>
<p><a href="https://segmentfault.com/a/1190000000683599" target="_blank" rel="external">Chrome dev tools 相关资料</a></p>
<h2 id="curl"><a href="#curl" class="headerlink" title="curl"></a>curl</h2><p>curl也是和上面poastman与paw功能类似的，不过没有和上面两款放在一起讲是因为curl比较重要，而且具有统一标准性与方便性。</p>
<p>curl是利用URL语法在命令行方式下工作的开源文件传输工具。它被广泛应用在Unix、多种Linux发行版中，并且有DOS和Win32、Win64下的移植版本。</p>
<p>还是原先的例子，请求知乎的api。</p>
<p><img src="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/curl.png" alt=""></p>
<p>很简单在curl命令直接加入url即可发送网络请求。</p>
<p>为什么有postman和paw这么友好的软件后，还需要介绍的curl呢，因为curl是一个命令，是文本，是字符串，当你其他同事开发联调的时候，直接通过im工具发送即可，这样网络请求就能很容移动复现。很多的上面介绍的charles、paw、google dev tool都支持把某一条请求导出为curl命令。这就相当于curl是一个标准，可以在不同机器上面复用，所以了解和使用curl是很有必要的。比如联调开发时候，服务器某个api调试不通过，需要与服务器同学沟通与复习，你直接丢一个curl语句即可，如果对方很懂，那么会觉的你很专业，如果对方不懂，顺便可以装个逼。</p>
<p><a href="http://www.cnblogs.com/gbyukg/p/3326825.html" target="_blank" rel="external">curl 资料</a></p>
<p><a href="https://curl.haxx.se/" target="_blank" rel="external">curl 官网</a></p>
<h1 id="OkHttp相关"><a href="#OkHttp相关" class="headerlink" title="OkHttp相关"></a>OkHttp相关</h1><p>前面介绍了OkHttp，下面介绍几个基于OkHttp拦截器机制衍生出的常用的工具。</p>
<h2 id="logging-interceptor"><a href="#logging-interceptor" class="headerlink" title="logging-interceptor"></a>logging-interceptor</h2><p>开发中经常需要对网络请求进行查看，抓包是可以的，不过现在很多app都是全栈https，想要抓包就没有那么容易了，那么最简单的还是打日志。</p>
<p><code>logging-interceptor</code>就是干这个事的，在初始化okhttpclient的时候，添加下这个拦截器，那么所有的网络请求会被记录下来。</p>
<p><a href="https://github.com/square/okhttp/wiki/Interceptors" target="_blank" rel="external">相关资料</a></p>
<p><a href="https://github.com/ihsanbal/LoggingInterceptor" target="_blank" rel="external">相关资料</a></p>
<h2 id="Stetho"><a href="#Stetho" class="headerlink" title="Stetho"></a>Stetho</h2><p>Stetho是Facebook开源的一个工具，前面说过Google Chrome dev tools，那么Stetho可以让Chrome调试Android，监控网络请求。</p>
<p>同时Stetho还支持查看数据库，SharePreference等，而这个前提是必须root，查看view树，使用Stetho也可以做到。</p>
<p>网上也有很多也有很多相关资料，这里不介绍详细使用。</p>
<p><a href="https://github.com/facebook/stetho" target="_blank" rel="external">stetho github</a></p>
<p><a href="http://www.jianshu.com/p/03da9f91f41f" target="_blank" rel="external">stetho 相关资料</a></p>
<h2 id="chuck"><a href="#chuck" class="headerlink" title="chuck"></a>chuck</h2><p>上面介绍的两款工具，一种是需要在logcat中查看网络请求数据，一种是需要在chrome中查看数据，有没有办法不需要借助任何第三方工具，直接查看呢，答案是肯定的。chuck是我最近关注比较高的一个开源工具，而且很快的就在项目中使用了。</p>
<p>下面官网的截图，可以先了解下chuck的使用效果。</p>
<p><img src="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/chuck.gif" alt=""></p>
<p>在高版本的Android中，还支持多屏显示，那么一边操作一边显示。</p>
<p><img src="https://raw.githubusercontent.com/LiushuiXiaoxia/AndroidHttp/master/doc/multiwindow.gif" alt=""></p>
<p>集成的方法都很简单，只需要在初始化OkHttpClient的时候，添加对应的拦截器即可。</p>
<p>Gradle依赖</p>
<figure class="highlight gradle"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">dependencies</span> &#123;</div><div class="line">   debugCompile <span class="string">'com.readystatesoftware.chuck:library:1.0.4'</span></div><div class="line">   releaseCompile <span class="string">'com.readystatesoftware.chuck:library-no-op:1.0.4'</span></div><div class="line"> &#125;</div></pre></td></tr></table></figure>
<p>添加拦截器</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">OkHttpClient client = <span class="keyword">new</span> OkHttpClient.Builder()</div><div class="line">  .addInterceptor(<span class="keyword">new</span> ChuckInterceptor(context))</div><div class="line">  .build();</div></pre></td></tr></table></figure>
<p><a href="https://github.com/jgilfelt/chuck" target="_blank" rel="external">Chuck github</a></p>
<h1 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h1><h2 id="RESTful"><a href="#RESTful" class="headerlink" title="RESTful"></a>RESTful</h2><p>RESTful一种软件架构风格，设计风格而不是标准，只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁，更有层次，更易于实现缓存等机制。</p>
<p>REST（英文：Representational State Transfer，简称REST）描述了一个架构样式的网络系统，比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中，他是 HTTP 规范的主要编写者之一。在目前主流的三种Web服务交互方案中，REST相比于SOAP（Simple Object Access protocol，简单对象访问协议）以及XML-RPC更加简单明了，无论是对URL的处理还是对Payload的编码，REST都倾向于用更加简单轻量的方法设计和实现。值得注意的是REST并没有一个明确的标准，而更像是一种设计的风格。</p>
<p>虽然本文的主题是介绍Android Http开发的相关内容，并且RESTful是服务端的一种概念。但是我觉的，还是有很必要了解的，最起码可以作为判断你的服务端小伙伴给的接口是否满足RESTful的标准的依据。</p>
<p>后面贴一篇<a href="http://www.ruanyifeng.com/blog/2011/09/restful" target="_blank" rel="external">阮一峰大神的博客介绍RESTful</a></p>
<h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><h2 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h2><p>上面介绍了很多种关于网络请求的工具，具体可以分为这几类。</p>
<p>HTTP接口调用工具，这类工具主要是模拟客户端，发起网络请求，方便调试服务器接口。</p>
<ul>
<li>postman</li>
<li>paw</li>
<li>curl</li>
</ul>
<p>抓包工具，这类工具不光适合Android开发，也适合其他网络开发，工具使用简单，不过在使用前需要做少许代理配置。WiresShark是一款更加强大的工具，使用比较复杂，而且比较底层，所以在本文中就没介绍，有兴趣的同学可以自己查阅相关资料。</p>
<ul>
<li>Charles</li>
<li>Fiddler</li>
<li>WiresShark</li>
</ul>
<p>Android Http请求工具库，这类工具类变化很快，经常会过个几年就会有新的一种工具替换，但是本质思想还是一样的，都是基于URLConnection和HTTP做了一次封装调用。</p>
<ul>
<li>URLConnection</li>
<li>HttpClient</li>
<li>Volley</li>
<li>OkHttp</li>
</ul>
<p>OkHttp相关，这类工具都是基于OkHttp做了二次封装开发，这个主要归功于OkHttp强大开发模式和架构，开发人员可以方便对OkHttp进行自定义和二次开发。工具很强大，不过也有局限性，只能依附于OkHttp的框架，不利于扩展到其他平台和工具。</p>
<ul>
<li>logging-interceptor</li>
<li>Stetho</li>
<li>Chuck</li>
</ul>
<h2 id="工具对比"><a href="#工具对比" class="headerlink" title="工具对比"></a>工具对比</h2><p>上面介绍好几款可以监控App网络请求的工具，那么如何根据实际情况，选择一款适合自己项目和团队的工具呢？</p>
<h3 id="Charles-amp-Fiddler"><a href="#Charles-amp-Fiddler" class="headerlink" title="Charles &amp; Fiddler"></a>Charles &amp; Fiddler</h3><p>这类工具不依赖与平台和App开发的工具库，不管你是Android、还是iOS，不管使用的是Volley，还是OkHttp都是可以监控的，同时还支持HTTP的调试，方便mock数据，简直是神器。</p>
<p>不过也有少许缺点，比如是不支持Https，如果你的app使用的是https接口，那么这类工具一般情况是不能使用的，不过也有办法，比如把charles的证书设置为根证书，则可以检测到。但是也是有局限的，如果app设置强制校验https证书，此类方法还是不可行。</p>
<p>因为平台无光，可检测到某个手机设备上面的全部网络请求，数据量有时候会很大，如果经常调试某一个app，那么域名一般是固定的，可进行相对应的过滤。</p>
<h3 id="OkHttp相关-1"><a href="#OkHttp相关-1" class="headerlink" title="OkHttp相关"></a>OkHttp相关</h3><p>通过标题可以看成，此类工具必须依附于OKHttp，那么只能满足Android平台并且App的网络请求库是OkHttp。上面介绍的三款工具，可以选择性的选择其中几种或者是全部，暂时还没有发现冲突的地方。因为是直接嵌入到代码中，那么Https也是可以监控到。同时也只能监控当前设备上的当前应用，不可以检测其他的app。</p>
<p>不过在发布线上或者正式颁布时，需要手动去除这些代码，否则会有很大麻烦，同时也会把相关的隐私和安全反馈给使用的用户。</p>
<p>好了，上面就是关于App网络情况的监控工具比较，建议两个大分类都可以几个或者多个配合使用，具体问题在根据具体工具使用，方便问题解决与网络监控。</p>
<h2 id="其他建议"><a href="#其他建议" class="headerlink" title="其他建议"></a>其他建议</h2><p>上面介绍的OkHttp的相关的工具，都是需要在初始化OkHttpClient的时候，手动添加对应的拦截器，如果忘记添加则不会产生效果。</p>
<p>那么可以使用现在流行的Aop技术，在编译时候，会在所有调用OkHttpClient的地方，自动添加，保证不会忘记，如果你的App还是用其他的sdk，sdk里面也是用OKhttp的话，也会监控到sdk里面的网络请求，不少大厂已经使用了这种方法，然后收集请求数据到后端，方便管理和优化。</p>
<p>下面简单介绍相关代码:</p>
<p>首先集成<code>gradle_plugin_android_aspectjx</code>插件</p>
<figure class="highlight gradle"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">dependencies</span> &#123;</div><div class="line">    <span class="keyword">classpath</span> <span class="string">'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.9'</span></div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>然后定义Aspectj切入点</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div></pre></td><td class="code"><pre><div class="line"></div><div class="line"><span class="keyword">import</span> com.facebook.stetho.okhttp3.StethoInterceptor;</div><div class="line"><span class="keyword">import</span> com.readystatesoftware.chuck.ChuckInterceptor;</div><div class="line"></div><div class="line"><span class="keyword">import</span> org.aspectj.lang.ProceedingJoinPoint;</div><div class="line"><span class="keyword">import</span> org.aspectj.lang.annotation.Around;</div><div class="line"><span class="keyword">import</span> org.aspectj.lang.annotation.Aspect;</div><div class="line"><span class="keyword">import</span> org.aspectj.lang.annotation.Pointcut;</div><div class="line"></div><div class="line"><span class="keyword">import</span> me.ele.breakfastapp.AppContext;</div><div class="line"><span class="keyword">import</span> okhttp3.OkHttpClient;</div><div class="line"></div><div class="line"><span class="meta">@Aspect</span></div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">OkHttpAspect</span> </span>&#123;</div><div class="line"></div><div class="line">    <span class="meta">@Pointcut</span>(<span class="string">"call(public okhttp3.OkHttpClient build())"</span>)</div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">build</span><span class="params">()</span> </span>&#123;</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="meta">@Around</span>(<span class="string">"build()"</span>)</div><div class="line">    <span class="function"><span class="keyword">public</span> Object <span class="title">aroundBuild</span><span class="params">(ProceedingJoinPoint joinPoint)</span> <span class="keyword">throws</span> Throwable </span>&#123;</div><div class="line">        Object target = joinPoint.getTarget();</div><div class="line">        <span class="keyword">if</span> (target <span class="keyword">instanceof</span> OkHttpClient.Builder) &#123;</div><div class="line">            OkHttpClient.Builder builder = (OkHttpClient.Builder) target;</div><div class="line">            builder.addNetworkInterceptor(<span class="keyword">new</span> StethoInterceptor());</div><div class="line">            builder.addNetworkInterceptor(<span class="keyword">new</span> ChuckInterceptor(AppContext.get()));</div><div class="line">        &#125;</div><div class="line"></div><div class="line">        <span class="keyword">return</span> joinPoint.proceed();</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>那么在代码编译的时候，会自动插入字节码。</p>
<p>Aop相关资料:</p>
<p><a href="http://blog.csdn.net/innost/article/details/49387395" target="_blank" rel="external">Aop介绍</a></p>
<p><a href="http://blog.csdn.net/crazy__chen/article/details/52014672" target="_blank" rel="external">Aop资料</a></p>
<p><a href="http://www.jianshu.com/p/bb9343e8af17" target="_blank" rel="external">Assectj</a></p>
<p><a href="https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx" target="_blank" rel="external">Assectj Gradle 插件</a></p>
<h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><p><a href="http://www.cnblogs.com/ranyonsue/p/5984001.html" target="_blank" rel="external">Http博客</a></p>
<p><a href="http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html" target="_blank" rel="external">Http博客</a></p>
<p><a href="http://www.blogjava.net/supercrsky/articles/247449.html" target="_blank" rel="external">URLConnection</a></p>
<p><a href="https://developer.android.com/reference/org/apache/http/client/package-summary.html" target="_blank" rel="external">Android HttpClient</a></p>
<p><a href="http://blog.csdn.net/wangpeng047/article/details/19624529" target="_blank" rel="external">HttpClient相关博客</a></p>
<p><a href="http://blog.csdn.net/guolin_blog/article/details/17482095" target="_blank" rel="external">Volley相关资料</a></p>
<p><a href="http://blog.csdn.net/guolin_blog/article/details/12452307" target="_blank" rel="external">Volley相关资料</a></p>
<p><a href="https://github.com/square/okhttp" target="_blank" rel="external">OkHttp</a></p>
<p><a href="https://github.com/square/retrofit" target="_blank" rel="external">Retrofit Github地址</a></p>
<p><a href="http://blog.devtang.com/2015/11/14/charles-introduction/" target="_blank" rel="external">Charles介绍</a></p>
<p><a href="http://blog.csdn.net/guijiaoba/article/details/43198503" target="_blank" rel="external">Charles Mock 数据</a></p>
<p><a href="https://www.getpostman.com/" target="_blank" rel="external">Postman官网</a></p>
<p><a href="http://chromecj.com/web-development/2014-09/60.html" target="_blank" rel="external">Postman资料</a></p>
<p><a href="https://paw.cloud/" target="_blank" rel="external">Paw 官网</a></p>
<p><a href="https://yq.aliyun.com/articles/29772" target="_blank" rel="external">Paw 使用教程</a></p>
<p><a href="https://developer.chrome.com/devtools" target="_blank" rel="external">Chrome dev tools 相关资料</a></p>
<p><a href="https://github.com/GoogleChrome/devtools-docs" target="_blank" rel="external">Chrome dev tools 相关资料</a></p>
<p><a href="https://segmentfault.com/a/1190000000683599" target="_blank" rel="external">Chrome dev tools 相关资料</a></p>
<p><a href="http://www.cnblogs.com/gbyukg/p/3326825.html" target="_blank" rel="external">curl 资料</a></p>
<p><a href="https://curl.haxx.se/" target="_blank" rel="external">curl 官网</a></p>
<p><a href="https://github.com/square/okhttp/wiki/Interceptors" target="_blank" rel="external">Interceptors相关资料</a></p>
<p><a href="https://github.com/ihsanbal/LoggingInterceptor" target="_blank" rel="external">LoggingInterceptors相关资料</a></p>
<p><a href="https://github.com/facebook/stetho" target="_blank" rel="external">stetho github</a></p>
<p><a href="http://www.jianshu.com/p/03da9f91f41f" target="_blank" rel="external">stetho 相关资料</a></p>
<p><a href="https://github.com/jgilfelt/chuck" target="_blank" rel="external">Chuck github</a></p>
<p><a href="http://www.ruanyifeng.com/blog/2011/09/restful" target="_blank" rel="external">RESTful</a></p>
<p><a href="http://blog.csdn.net/innost/article/details/49387395" target="_blank" rel="external">Aop介绍</a></p>
<p><a href="http://blog.csdn.net/crazy__chen/article/details/52014672" target="_blank" rel="external">Aop资料</a></p>
<p><a href="http://www.jianshu.com/p/bb9343e8af17" target="_blank" rel="external">Assectj</a></p>
<p><a href="https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx" target="_blank" rel="external">Assectj Gradle 插件</a></p>

      
    </div>
    
    
    

    

    
      <div>
        <div style="padding: 10px 0; margin: 20px auto; width: 90%; text-align: center;">
  <div>坚持原创技术分享，您的支持将鼓励我继续创作！</div>
  <button id="rewardButton" disable="enable" onclick="var qr = document.getElementById('QR'); if (qr.style.display === 'none') {qr.style.display='block';} else {qr.style.display='none'}">
    <span>打赏</span>
  </button>
  <div id="QR" style="display: none;">

    
      <div id="wechat" style="display: inline-block">
        <img id="wechat_qr" src="/images/wechat_pay.jpeg" alt="流水不腐小夏 微信支付"/>
        <p>微信支付</p>
      </div>
    

    
      <div id="alipay" style="display: inline-block">
        <img id="alipay_qr" src="/images/alipay.jpeg" alt="流水不腐小夏 支付宝"/>
        <p>支付宝</p>
      </div>
    

    

  </div>
</div>

      </div>
    

    

    <footer class="post-footer">
      
        <div class="post-tags">
          
            <a href="/tags/Android/" rel="tag"># Android</a>
          
            <a href="/tags/Http/" rel="tag"># Http</a>
          
            <a href="/tags/OkHttp/" rel="tag"># OkHttp</a>
          
            <a href="/tags/Curl/" rel="tag"># Curl</a>
          
            <a href="/tags/PostMan/" rel="tag"># PostMan</a>
          
        </div>
      

      
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2016/07/25/Android-Test/" rel="next" title="Android测试总结">
                <i class="fa fa-chevron-left"></i> Android测试总结
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/2017/02/25/Android-databing-plugin/" rel="prev" title="AndroidStudio插件：布局文件转化Databinding">
                AndroidStudio插件：布局文件转化Databinding <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </div>
  
  
  
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          

  
    <div class="comments" id="comments">
      <div id="disqus_thread">
        <noscript>
          Please enable JavaScript to view the
          <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a>
        </noscript>
      </div>
    </div>

  



        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap">
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview-wrap">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview-wrap sidebar-panel">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
            
              <img class="site-author-image" itemprop="image"
                src="/images/avatar.jpeg"
                alt="流水不腐小夏" />
            
              <p class="site-author-name" itemprop="name">流水不腐小夏</p>
              <p class="site-description motion-element" itemprop="description"></p>
          </div>

          <nav class="site-state motion-element">

            
              <div class="site-state-item site-state-posts">
              
                <a href="/archives/">
              
                  <span class="site-state-item-count">31</span>
                  <span class="site-state-item-name">日志</span>
                </a>
              </div>
            

            
              
              
              <div class="site-state-item site-state-categories">
                <a href="/categories/index.html">
                  <span class="site-state-item-count">10</span>
                  <span class="site-state-item-name">分类</span>
                </a>
              </div>
            

            
              
              
              <div class="site-state-item site-state-tags">
                <a href="/tags/index.html">
                  <span class="site-state-item-count">55</span>
                  <span class="site-state-item-name">标签</span>
                </a>
              </div>
            

          </nav>

          
            <div class="feed-link motion-element">
              <a href="/atom.xml" rel="alternate">
                <i class="fa fa-rss"></i>
                RSS
              </a>
            </div>
          

          <div class="links-of-author motion-element">
            
              
                <span class="links-of-author-item">
                  <a href="https://github.com/LiushuiXiaoxia" target="_blank" title="GitHub">
                    
                      <i class="fa fa-fw fa-GitHub"></i>GitHub</a>
                </span>
              
                <span class="links-of-author-item">
                  <a href="http://www.jianshu.com/u/58771f980bac" target="_blank" title="简书">
                    
                      <i class="fa fa-fw fa-简书"></i>简书</a>
                </span>
              
                <span class="links-of-author-item">
                  <a href="http://blog.csdn.net/guijiaoba" target="_blank" title="CSDN">
                    
                      <i class="fa fa-fw fa-CSDN"></i>CSDN</a>
                </span>
              
            
          </div>

          
          

          
          

          

        </div>
      </section>

      
      <!--noindex-->
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">

            
              
            

            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#Android-Http网络开发神兵利器"><span class="nav-number">1.</span> <span class="nav-text">Android Http网络开发神兵利器</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#Http协议"><span class="nav-number">2.</span> <span class="nav-text">Http协议</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#HTTP简介"><span class="nav-number">2.1.</span> <span class="nav-text">HTTP简介</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#主要特点"><span class="nav-number">2.2.</span> <span class="nav-text">主要特点</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Request"><span class="nav-number">2.3.</span> <span class="nav-text">Request</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Response"><span class="nav-number">2.4.</span> <span class="nav-text">Response</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Code"><span class="nav-number">2.5.</span> <span class="nav-text">Code</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Method"><span class="nav-number">2.6.</span> <span class="nav-text">Method</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Header"><span class="nav-number">2.7.</span> <span class="nav-text">Header</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#网络请求库"><span class="nav-number">3.</span> <span class="nav-text">网络请求库</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#URLConnection"><span class="nav-number">3.1.</span> <span class="nav-text">URLConnection</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Apache-HttpClient"><span class="nav-number">3.2.</span> <span class="nav-text">Apache HttpClient</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Volley"><span class="nav-number">3.3.</span> <span class="nav-text">Volley</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#OkHttp-amp-Retrofit"><span class="nav-number">3.4.</span> <span class="nav-text">OkHttp & Retrofit</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#工具"><span class="nav-number">4.</span> <span class="nav-text">工具</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#Charles"><span class="nav-number">4.1.</span> <span class="nav-text">Charles</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#PostMan-amp-Paw"><span class="nav-number">4.2.</span> <span class="nav-text">PostMan & Paw</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Chrome-Dev-Tools"><span class="nav-number">4.3.</span> <span class="nav-text">Chrome Dev Tools</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#curl"><span class="nav-number">4.4.</span> <span class="nav-text">curl</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#OkHttp相关"><span class="nav-number">5.</span> <span class="nav-text">OkHttp相关</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#logging-interceptor"><span class="nav-number">5.1.</span> <span class="nav-text">logging-interceptor</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Stetho"><span class="nav-number">5.2.</span> <span class="nav-text">Stetho</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#chuck"><span class="nav-number">5.3.</span> <span class="nav-text">chuck</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#其他"><span class="nav-number">6.</span> <span class="nav-text">其他</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#RESTful"><span class="nav-number">6.1.</span> <span class="nav-text">RESTful</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#总结"><span class="nav-number">7.</span> <span class="nav-text">总结</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#心得"><span class="nav-number">7.1.</span> <span class="nav-text">心得</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#工具对比"><span class="nav-number">7.2.</span> <span class="nav-text">工具对比</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#Charles-amp-Fiddler"><span class="nav-number">7.2.1.</span> <span class="nav-text">Charles & Fiddler</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#OkHttp相关-1"><span class="nav-number">7.2.2.</span> <span class="nav-text">OkHttp相关</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#其他建议"><span class="nav-number">7.3.</span> <span class="nav-text">其他建议</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#参考资料"><span class="nav-number">8.</span> <span class="nav-text">参考资料</span></a></li></ol></div>
            

          </div>
        </section>
      <!--/noindex-->
      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright">&copy; 2015 &mdash; <span itemprop="copyrightYear">2017</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">流水不腐小夏</span>

  
</div>


  <div class="powered-by">由 <a class="theme-link" target="_blank" href="https://hexo.io">Hexo</a> 强力驱动</div>



  <span class="post-meta-divider">|</span>



  <div class="theme-info">主题 &mdash; <a class="theme-link" target="_blank" href="https://github.com/iissnan/hexo-theme-next">NexT.Gemini</a> v5.1.3</div>




        
<div class="busuanzi-count">
  <script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>

  

  
</div>








        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  












  
  
    <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>
  

  
  
    <script type="text/javascript" src="/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>
  

  
  
    <script type="text/javascript" src="/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>
  


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.1.3"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.1.3"></script>



  
  


  <script type="text/javascript" src="/js/src/affix.js?v=5.1.3"></script>

  <script type="text/javascript" src="/js/src/schemes/pisces.js?v=5.1.3"></script>



  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=5.1.3"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=5.1.3"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.1.3"></script>



  


  

    
      <script id="dsq-count-scr" src="https://mycommons-cn.disqus.com/count.js" async></script>
    

    
      <script type="text/javascript">
        var disqus_config = function () {
          this.page.url = 'http://mycommons.cn/2016/12/25/Android-Net/';
          this.page.identifier = '2016/12/25/Android-Net/';
          this.page.title = 'Android Http网络开发神兵利器';
        };
        var d = document, s = d.createElement('script');
        s.src = 'https://mycommons-cn.disqus.com/embed.js';
        s.setAttribute('data-timestamp', '' + +new Date());
        (d.head || d.body).appendChild(s);
      </script>
    

  




	





  














  




  
  
  
  <link rel="stylesheet" href="/lib/algolia-instant-search/instantsearch.min.css">

  
  
  <script src="/lib/algolia-instant-search/instantsearch.min.js"></script>
  

  <script src="/js/src/algolia-search.js?v=5.1.3"></script>



  

  

  
  

  
  
    <script type="text/x-mathjax-config">
      MathJax.Hub.Config({
        tex2jax: {
          inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
          processEscapes: true,
          skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
        }
      });
    </script>

    <script type="text/x-mathjax-config">
      MathJax.Hub.Queue(function() {
        var all = MathJax.Hub.getAllJax(), i;
        for (i=0; i < all.length; i += 1) {
          all[i].SourceElement().parentNode.className += ' has-jax';
        }
      });
    </script>
    <script type="text/javascript" src="//cdn.bootcss.com/mathjax/2.7.1/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
  


  

  

</body>
</html>
